# Changelog

## 1.8.2 (2026-11-10)

### Added
- Copy Public Key to Server (Tools menu, right-click an SSH session, or the key generator's Copy to Server button): like `ssh-copy-id`, it logs in once (with your password if needed), creates `~/.ssh` and `authorized_keys` if they are missing, sets the permissions SSH requires (700 and 600), adds the key unless it is already there, then checks that the key logs in on its own. It also points out a misspelt `authorised_keys` file on the server, which SSH ignores.

### Changed
- Windows inside Saltbush (SFTP browsers, dialogs) have a darker edge and a shadow, so overlapping windows are easy to tell apart. In the SFTP browser, this computer's files and the server's files are each in their own outlined box, and each new browser opens a little lower and to the right instead of exactly on top of the last one.

## 1.8.1 (2026-11-10)

### Fixed
- Tear-off tabs on Windows with several monitors: a tab dragged out of the tab bar could open its window off the screen (it looked minimised, and only Maximise brought it back), and dragging a window back onto the tab bar often did not dock it. Window positions are now worked out in screen pixels, so monitors with different scaling no longer confuse them, and a new window is moved to exactly where the tab was dropped.

**Tried on real computers:** tear-off tabs and RDP sessions (new in 1.8.0) have been tried on a Linux desktop and on Windows with several monitors, including two RDP sessions at once. The system RDP program option (FreeRDP or mstsc) has not been tried.

## 1.8.0 (2026-11-10)

**Not yet tested on a real computer:** tear-off tabs and RDP sessions are new in 1.8.0 and have only been tested with automated tests and on a virtual X display (Xvfb), not yet on a real Windows or Linux computer.

### Added
- Tear-off tabs: drag a tab down out of the tab bar to open it in its own window, where the session keeps running. Dock it back with "Dock to Main Window", by closing the window, or (X11 and Windows) by dragging the window's "Drag to the tab bar" handle onto the main tab bar. Also: right-click a tab > Move to New Window, Window > Move Tab to New Window / Dock All Tabs to Main Window, and the command palette. Several tabs can be in their own windows; keys and shortcuts act on the window you are typing in.
- RDP sessions (Windows Remote Desktop) as a built-in session type in a normal tab, using IronRDP: TLS with Network Level Authentication (NTLM), the remote desktop fitted to the tab (it resizes with the tab) or a fixed size, keyboard and mouse, text clipboard both ways, Ctrl+Alt+Del, Windows key and Full screen buttons (Ctrl+Alt+End also sends Ctrl+Alt+Del). The server certificate is checked like an SSH host key: shown and asked about the first time, remembered in known_rdp_certificates, and a changed certificate is refused. Passwords come from a credential or are asked in the tab and never saved. Optionally use the system RDP program instead (FreeRDP on Linux, mstsc on Windows); the password is never put on a command line. New Session wizard, Quick Connect and a Session Options "RDP" page support it.

### Changed
- Terminal-only actions (Find, logging, file transfers, Send Break, scripting send) say they are not available on RDP tabs, and their buttons are greyed out there.
- The program is about 7 MB larger because of the RDP code.

## 1.7.0 (2026-11-10)

### Added
- Function keys: F1 Help (keyboard shortcuts), F2 Session Options, F3 / Shift+F3 Find next / previous, F4 Quick Connect, F5 Reconnect, F6 next split pane, F7 SFTP Browser, F8 send a file (Zmodem upload), F9 start/stop logging, F11 full screen, F12 Script > Run, Shift+F12 cancel the script, Ctrl+F12 run the last script again. F10 stays with the remote program. Alt+F1 to Alt+F12 send the plain function key to the remote program, and the session option "Function keys go to the remote program" (Session Options > Input) gives them all back to it. Your own key mappings win over these keys. Menus, the Keyboard Shortcuts window and the command palette show them; Edit > Find Previous and Script > Run Last Script Again are new.
- Script > Run remembers the last script, its arguments and its folder, also after a restart.
- After an update, Restart Now brings the window back with the same size, position (not on Wayland), maximised, minimised or full-screen state. The window size and maximised state are also remembered between normal starts.
- Highlighting and Key Mappings are edited in tables: add, remove and reorder rows, a colour picker, a Regex box, a "press a key" button and an action list, with errors shown per row. Stored settings are unchanged.
- Sync between computers: Options > Global Options > Sync keeps sessions and their folders, credential user names (never passwords), button bars and the default session the same on every computer through a shared folder (Nextcloud, Syncthing, Dropbox or a network share). Settings that belong to one computer, such as local shells, serial ports, key files and log folders, stay as they are on each computer.
- SSH: jump hosts (one or a chain, `user@host:port,user2@host2`) in the built-in engine, each hop with its own host-key check and login; the SFTP browser works through jump hosts too. About 40 OpenSSH `-o` options are now handled by the built-in engine (ServerAliveInterval/CountMax, ConnectTimeout, Ciphers, KexAlgorithms, HostKeyAlgorithms, MACs, PubkeyAcceptedAlgorithms, Compression, StrictHostKeyChecking, UserKnownHostsFile, IdentitiesOnly, IdentityFile, CertificateFile, Port, User, HostName, ProxyJump, ProxyCommand, ForwardAgent, ForwardX11, the forwards and the authentication switches); others still use the OpenSSH client, which the terminal names. Ed25519 OpenSSH certificates now work in the built-in engine.
- SSH: "Use FIPS-approved algorithms only" (Session Options > SSH2) limits key exchange, ciphers, MACs and key types to FIPS-approved ones (and RSA keys to 2048 bits or more), refuses Ed25519 keys with a clear message, and shows whether OpenSSL's FIPS provider is active. It limits algorithms; Saltbush is not a FIPS 140 validated module.
- Terminal emulation: double-width and double-height lines, left/right margins (DECLRMM/DECSLRM), real 132-column mode (the screen becomes 132 columns and the font shrinks to fit), selective erase (DECSCA, DECSED, DECSEL), 8-bit C1 controls in ISO 8859 sessions (not in CP437 or other code pages) and C1 code points in UTF-8, and sixel graphics (images scroll with the text; the device-attributes reply now announces sixel for xterm types).
- macOS: the code now has macOS support (settings in ~/Library/Application Support/saltbush, passwords in the Keychain, /dev/cu.* serial ports, zsh login shell) and `scripts/build-macos.sh` builds a .app, .zip and .dmg on a Mac with Homebrew. It has not yet been built or run on a Mac.

### Changed
- The Activity, Options and other labels use ">" between menu names, and the Button Bars dialog uses Up and Remove buttons, because the interface font has no arrow characters.
- Keepalives with ServerAliveCountMax close a session whose server stops answering.
- A host key of a different type than the one in known_hosts now gets the normal "new host" question with a note, instead of being refused as a changed key. A changed key of the same type is still refused.

### Fixed
- Password and keyboard-interactive SSH logins, remote and SOCKS forwards are now covered by automated tests.

## 1.6.1 (2026-11-10)

### Fixed
- Scripts ran slowly, especially SyncTERM-Lua bots such as lordbot.lua, and almost stopped while the window was minimised or hidden. Every script request waited for the window to draw its next frame (at most once per screen refresh, and not at all when the window is not shown). Requests are now answered by a background thread, and waits for text return as soon as text arrives instead of checking every 25–30 ms. A full-screen read (as lordbot.lua does after each move) went from about 0.37 s to under 0.02 s on a test display, and more on a real screen.
- Text in the Activity pane could not be copied while a script was writing to it: each new line cleared the selection and Ctrl+C went to the terminal. The pane is now one selectable text: the selection stays as lines arrive, Ctrl+C copies it after you click or drag in the pane, and right-click offers Copy and Copy All. A Copy All button was added.

## 1.6.0 (2026-11-10)

### Added
- SFTP browser: two panes, this computer on the left and the server on the right. **Upload >>** and **<< Download** copy the selected files and folders across, and double-clicking a file copies it to the other side. New Folder, Rename and Delete work on both sides (deleting on this computer asks first and is permanent). Shift+click selects a range.
- Interrupted transfers resume. An unfinished download is kept as `name.part` on this computer and an unfinished upload as `name.part` on the server; sending the same file again continues where it stopped, as long as the original has not changed since.
- Permissions…: tick read, write and run for owner, group and others on the selected server files and folders.
- Transfers keep the file's modification time. Uploads from Linux keep the file's permissions (for example, scripts stay runnable).

### Changed
- The local pane replaces the Upload Files… and Upload Folder… buttons and the Download folder chooser. Downloads go to the folder shown on the left, which starts at the session's download folder. Dropping files on the window still uploads them.

## 1.5.0 (2026-11-10)

### Added
- Update notifications: Saltbush checks the website once a day (https://retro.theiguru.au/saltbush/latest.json) and says when a new version is out, with Update Now, Not Now and Skip This Version. Update Now installs the new .deb (asks for your password through pkexec) or runs the new Windows installer; other copies open the download page. Help → Check for Updates checks at any time. Turn the notices off in Options → Global Options or in the update window (on by default).

### Fixed
- Pasting on Wayland (KDE Plasma and others): Edit → Paste, the right-click menu, the toolbar button, Shift+Insert, middle-click and script clipboard reads now read the Wayland clipboard. They used to read the X11 clipboard, which KDE keeps empty for Wayland windows, so only Ctrl+Shift+V worked.

## 1.4.0 (2026-11-09)

### Added
- SSH: the built-in engine now does X11 forwarding (fake cookie swapped locally; untrusted mode uses an xauth untrusted cookie like `ssh -X`), agent forwarding (Linux), OpenSSH certificate logins (RSA and ECDSA), Kerberos (GSSAPI) logins with optional credential delegation, and compression. These no longer need the OpenSSH client.
- Tools → SSH Agent: list the agent's keys, add key files (passphrase, lifetime, confirm-on-use), add or remove smartcard/token keys through PKCS#11, remove one or all keys, lock and unlock, and start an agent for Saltbush's sessions (stopped when Saltbush exits).
- SFTP browser: Transfer → SFTP Browser or right-click an SSH session. Browse folders, upload files and folders (or drop them on the window), download, new folder, rename, delete, progress and Cancel. Login questions appear in the window.
- Built-in Xmodem (checksum, CRC, 1K), Ymodem batch and Kermit (long packets, CRC, 8th-bit prefixing, repeat counts) uploads and downloads, on Linux and Windows. Kermit downloads start by themselves. The lrzsz programs are no longer needed.
- Terminal emulation: DEC Special Graphics and G0–G3 character sets, tab stops (HTS, TBC, CHT, CBT), IND/NEL, DECALN, REP, CNL/CPL, HPA/HPR/VPR/HVP, insert and newline modes, auto-wrap control (the "Wrap long terminal lines" option now works), reverse-video screen, alternate screen 1047/1048, DECSTR soft reset, ED 3, cursor shapes set by programs (DECSCUSR), dim, hidden and strikethrough text, VT220 and xterm device-attribute replies and mode reports (DECRQM). IL/DL respect the scroll region.
- New terminal types Wyse 60 and SCO ANSI, with their own keys; VT220 sessions send VT220 function and editing keys.
- Split panes: View → Split Left/Right (Ctrl+Shift+E) and Split Top/Bottom (Ctrl+Shift+O) show several sessions at once. Click a pane to give it the keyboard; drag the divider to resize. A tab chosen in the tab bar shows in the active pane, or its pane becomes active if it is already on screen. View → Close Pane and Single Pane undo the split. Each pane's terminal gets its own size.
- Linux: the Debian package now includes AppStream information, so Saltbush Terminal shows up in Discover and other software centres after it is installed.

### Changed
- X/Ymodem use the built-in engines instead of lrzsz; the package no longer recommends lrzsz.

## 1.3.1 (2026-11-09)

### Fixed
- Lua `regex.find`, `regex.match`, `expect_regex` and `on(..., 'regex')` now accept PCRE features (lookahead, lookbehind, back-references, inline flags) as SyncTERM-Lua does. lordbot.lua and twbot.lua stopped with a "bad regex" error.

## 1.3.0 (2026-11-09)

### Added
- Windows version: installer (per user, Start menu shortcut, uninstaller) and a portable zip. Built-in SSH, scripting (Python and Lua), Telnet, RLogin, serial (COM ports), local shells (PowerShell or cmd) and Zmodem work on Windows; credential passwords use Windows Credential Manager.
- Built-in Zmodem (ported from Lantern Terminal's engine), used on Linux and Windows. Downloads still start by themselves; uploads start when the host is ready to receive.
- A program icon of its own (taskbar, window list, menus, the Windows exe and installer).

### Changed
- Each tab now has its close button inside it (middle-click also closes a tab).

### Fixed
- Lua scripts did not have the standard `debug` library (SyncTERM-Lua and Lantern scripts may use it).
- High CPU use: the built-in SSH engine busy-waited for data, and the window redrew itself continuously. An idle window now uses almost no CPU.
- Scripts could connect to the session's port instead of the application when a session had a port number set (the variable names clashed).

## 1.2.2 (2026-11-09)

### Changed
- Colours in Session Options are chosen in their own picker window (with a hex field and a Close button) instead of a pop-up. Closing it leaves Session Options open, so text, background and cursor colours can be set one after another. The cursor colour uses the same picker.

## 1.2.1 (2026-11-09)

### Fixed
- Every Browse… button and file dialog (private key, log file, scripts, transfers, import, export) crashed the program: the file-dialog library was built to need a runtime the program does not start. It now uses its own.

## 1.2.0 (2026-11-09)

### Changed
- The program is now called Saltbush Terminal (command `saltbush`). Settings from SecureTerm (`~/.config/secureterm`) are copied over the first time it starts.

### Added
- A built-in SSH engine (libssh), the default for SSH2 sessions: host-key checks and prompts in the terminal, agent, key, keyboard-interactive and password logins, remote commands, local/remote/SOCKS forwards, keepalive. The OpenSSH client remains available per session and is used automatically for features the engine lacks.
- Scripting with the same interface as Lantern Terminal: Python and built-in Lua 5.4, logon scripts, Script → Run/Cancel, recording, the Activity pane, script dialogs, Zmodem uploads from scripts, and the SyncTERM-Lua compatibility layer. Logon scripts now use this interface instead of standard input/output.

## 1.1.0 (2026-11-09)

### Fixed
- The project did not build: the patched `vt100` crate was missing. It is now in `vendored/vt100` with its changes documented.
- Find never found anything; it now searches the whole history and wraps round.
- Ctrl+C did nothing in the terminal, and Ctrl+W, Ctrl+D and other Ctrl keys were taken by the application. Application shortcuts now use Ctrl+Shift.
- The terminal took keyboard focus from dialogs every frame, so typing in Quick Connect, Find or the key generator could go to the shell.
- Save As could not change the name.
- A crash after about 2 MB of output containing non-ASCII text.
- "localhost" with no user name always opened a local shell, whatever the protocol. Local Shell is now its own protocol.
- Restore Defaults deleted every saved session; it now resets options only, and asks first. Deleting sessions also asks first.
- A settings file that could not be read was replaced by defaults on exit. It is now kept and the problem is reported; saves are atomic.
- The key passphrase was visible on the ssh-keygen command line, and choosing a key location could change the permissions of an existing folder such as the home folder.
- Host names starting with "-" could pass options to the SSH, Telnet and nc clients.
- The Command Window sent to every tab by default.
- A failed "log on connect" left the connection program running; closed sessions left zombie processes.
- Disabled toolbar buttons still worked; several settings had no effect; the profile's scrollback length was ignored beyond 500 lines; drawing copied the whole history every frame.
- Packaging: the README referred to files that did not exist and install.sh had a duplicated branch.

### Added
- Session Options pages for SSH2, Forwarding, Local Shell, Serial, Telnet, RLogin, Logon, Input, Behaviour, Highlighting, Key Mappings, Buttons and File Transfer (see README).
- Built-in Telnet, RLogin, raw TCP and serial connections.
- BBS support: CP437, ANSI-BBS emulation, iCE colours, the VGA font, scaled 80×25, BBS keys, cursor-position replies, Zmodem auto-download.
- New Session and New BBS Session wizards, Import BBS List (SyncTERM), Apply BBS Settings, multi-session editing.
- Credentials with passwords in the desktop password store; button bars; Zmodem/Ymodem/Xmodem transfers; Send Break; Reconnect.
- Character encodings, resize modes, highlighting, key mappings, paced and bracketed paste, OSC 52, answerback, bells, auto-reconnect, anti-idle.
- Log templates, timestamps, prefixes, rotation and connect/disconnect messages.
- A Debian package and a tarball installer with uninstall.
